home *** CD-ROM | disk | FTP | other *** search
- GCC unter Acorn's RISC-OS
- -------------------------
-
-
- 0. Installation
- ------------
-
- Die Installation beschraenkt sich auf:
-
- 1. RUN$Path um das Verzeichnis, in dem sich die GNU C executables befinden, ergaenzen (exe.)
- 2. Umgebungsvariable CPATH auf das Verzeichnis setzen, in dem sich die Header-Dateien befinden
- CPATH darf auch - durch ';' getrennt - mehrere Verzeichnisse enthalten.
- Bsp.: Befinden sich Ihre Header-Dateien in $.clib.1.h und $.clib.2.h, dann setzen Sie CPATH
- auf '$.clib.1;$.clib.2'
- Bei Bedarf koennen auch die Variablen C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH,
- OBJCPLUS_INLCUDE_PATH gesetzt werden (CPLUS_INCLUDE_PATH z.B. wird nur benutzt, wenn ein
- C++-Quelltext compiliert wird).
- 3. Unter Umstaenden Stubs und RISC_OSlib konvertieren (s.u.)
- 4. Ich empfehle, die Variable mulib$Path auf den vollen Namen des RISCLIB-Verzeichnisses zu
- setzen. Die Libraries koennen dann einfach mit mulib:stubsmu und mulib:oslib_mu angesprochen
- werden.
- 5. Die Dokumentation zu Compiler und Assembler finden Sie im Verzeichnis 'DOK'
-
-
-
- 1. Prefixes in Dateinamen
- ----------------------
-
- Unter Unix ist es ueblich, nicht wie unter RISC-OS, Dateitypen wie .c .o .cc dem eigentlichen
- Dateinamen als Endung mitzugeben. GCC erwartet deshalb alle Dateinamen in diesem Format. Um
- konkret auf die Dateien zuzugreifen, wird aber die Endung dem Namen vorangestellt. So wird aus
- 'GCC sample.c' ein 'GCC c.sample'. ACHTUNG: anders als z.B. bei Norcroft C wird aber aus bspw.
- 'irgend.sample.c' 'c.irgend.sample'.
- GCC benutzt die Endungen, um herauszufinden, um was fuer eine Datei es sich handelt. Deshalb
- darf die Endung nie vorangestellt werden.
-
- Die Endungen bedeuten:
-
- .c C Source
- .cc, .cxx, .C C++ Source (Achtung: nur .cc sollte unter RISC-OS verwendet werden)
- .m objective-C Source (im Moment nicht unterstuetzt)
- .o object file
- .h header file
- .i pre-processed file (cpp output)
- .ii pre-processed C++ file
- .s assembler source
- .S assembler source (needs pre-processing)
-
-
-
-
- 2. Optionen fuer GCC
- -----------------
-
- Eine genaue Erklaerung der einzelnen Optionen finden Sie in der Datei 'invoke' (tex.texinfo).
- Hier: Das Meiste ist gleich wie bei anderen C-Compilern auch. Nicht vergessen sollten Sie aber
- die Option -O oder gar -O2 (optimieren). Ohne diese Option erzeugt der Compiler ziemlich
- ineffizienten Code.
-
- Maschinenabhaengige Optionen:
- -mno-apsc verwenden der C-Aufrufkonvention fuer Funktionen
- -mcoproc Koprozessor ist vorhanden (aus Optimierungsgruenden, funktioniert auch ohne)
- -mpoke-function-name Funktionsnamen fuer post mortem debugger im Code aufnehmen
-
-
-
-
- 3. Include-Dateien
- ---------------
-
- Bei Include-Dateien wird wieder die Prefix-Schreibweise fuer Dateitypen verwendet. In den Quell-
- texten darf aber die Suffix-Schreibweise verwendet werden. Der pre-processor wandelt diese in
- Prefix um und erkennt ausserdem aus Unix stammende Verzeichnispfade. Aus /usr/include/sys/times.h
- wird also $.usr.include.sys.h.times, aus ../my-header.h wird ^.h.my-header. Erkannt werden aber
- nur die Endungen .h und .c.
-
- Suchreihenfolge fuer Include-Dateien:
-
- 1. aktuelles Verzeichnis oder mit -I angegebene Verzeichnisse
- 2. der in der Umgebungsvariablen CPATH enthaltene Pfad
- 3. der Pfad aus entweder C_INCLUDE_PATH (Standard C), CPLUS_INCLUDE_PATH (C++),
- OBJC_INCLUDE_PATH (Objective C) oder OBJCPLUS_INLCUDE_PATH (Objective C++)
-
- Die in Umgebungsvariablen abgelegten Pfade duerfen mehrere Verzeichnisse enthalten (duchr ';'
- getrennt). Die Unix-Schreibweise darf auch hier verwendet werden. Anders als bei RISC-OS ueblich
- darf der '.' bzw. '/' nicht letztes Zeichen in einem Verzeichnis-Namen sein (er wird vom Pre-
- Prozessor hinzugefuegt). Ebenso gehoert das '.h.' nicht in den Pfad.
-
-
-
-
- 4. Linker
- ------
-
- Leider muss der Linker-Aufruf explizit aufgefuehrt werden (also mit GCC die Option -c verwenden).
- Um 'absolute'-code zu erzeugen muss der Linker z.B. wie folgt aufgerufen werden:
-
- mulink -F -a32768 -osample -C o.sample1 o.sample2 mulib:stubsmu
- settype sample absolute
-
- Voraussetzung: mulib$path enthaelt den Verzeichnisnamen in dem stubsmu sich befindet.
- Dabei bedeuten:
-
- -F erstes Objekt der ersten Datei auf jeden Fall linken (sonst nur, wenn referenziert)
- wenn mit stubsmu gelinkt wird, ist diese Option nicht unbedingt notwendig, da
- stubsmu das Obligatory-Link-Flag gesetzt hat (also auf jeden Fall gelinkt wird) und
- ausserdem eine Referenz nach 'main' enthaelt.
- -a32768 Absoluten Code zum Ausfuehren auf Adresse 8000h erzeugen
- -osample den output in die Datei sample schreiben (Bitte KEIN Leerzeichen)
- -C nur den Code ohne Header, Publics, Relocs schreiben
-
- Tut mir leid, dass so viele Optionen noetig sind. Aber der Linker war urspruenglich nicht fuer
- RISC-OS gedacht.
- Werden uebrigens die -a und -C Optionen weggelassen, so wird ein Object-file erzeugt.
-
- Weitere Optionen:
-
- -x eine Liste von Symbolen und Modulen und ihren Adressen (bzw. Offsets) ausgeben
- -+ C++ - Code linken. D.h. Symbolnamen werden C++-like gesucht und - wenn nicht auf-
- findbar in Standard-C-Namen umgewandelt.
- Bsp.: printf( "%d", 10 ) in C++ erzeugt einen Assembler-Aufruf der Form
- ... bl printf__FPci. Falls ein Symbol printf__FPci existiert, wird der Linker
- einen Aufruf zu diesem Symbol generieren, andernfalls (mit eingeschalteter
- -+ Option) zus. den Namen printf ausprobieren (ohne den __F... - Teil).
- -$<suffix> die Zeichenfolge, die in C++-Bezeichnern den eigentl. Funktionsnamen und die
- Typenangabe trennt, einstellen. Voreinstellung: __F.
- -d keine Liste der doppelt definierten Publics ausgeben
- -u keine Liste der undefinierten Externals ausgeben
-
- Alle anderen Optionen sind fuer RISC-OS bedeutungslos bzw. nicht empfehlenswert.
-
- Stubs sollte auf jeden Fall vor der RISC_OSlib gelinkt werden. Ausserdem sollte die Datei, die
- die Funktion main enthaelt als erste gelinkt werden. Im Uebrigen spielt die Link-Reihenfolge
- keine Rolle. Objekte, die von keinem gelinkten Objekt referenziert werden, werden ignoriert, z.B.
- wird beim Linker-Aufruf
-
- mulink -F o.sample1 o.sample2 mulib:stubsmu
-
- o.sample2 nicht gelinkt, wenn weder von mulib:stubsmu noch von o.sample1 eine Funktion oder Variable
- aus o.sample1 referenziert wird.
-
- Wenn mit Stubs gelinkt wird, wird normalerweise die Meldung
-
- unresolved external(s)
- '__root_stack_size' in module 'Stub$$Code'
- '__RelocCode' in module 'Stub$$Code'
-
- erscheinen. Diese beiden Referenzen sind in der AOF-Datei als 'weak binding' gekennzeichnet,
- muessen also nicht unbedingt erfuellt werden. Applikationen werden also trotz dieser Meldung
- korrekt gelinkt.
-
- Wenn mit der RISC_OSlib gelinkt wird, erscheint ausserdem die Meldung
-
- warning: double defined public variable(s):
- 'C$$code' in module 'C$$code'
- 'C$$code' in module 'C$$code'
-
- Empfohlene Reaktion: Einfach ignorieren.
-
-
-
-
- 5. AOFConvert
- ----------
-
- AOFConvert ist ein utility, das Objekt-Dateien im AOF-Format ins MUPROS-Format konvertiert.
- Verwendet wird es wie:
-
- AOFConvert -l -osample o.sample
-
- Die Option -l unterdrueckt alle Warnungen (die sind sowieso ueberfluessig). Unter Umstaenden
- kann es noetig sein, auch die Option -O einzusetzen. Dann wird das so konvertierte Objekt auf
- jeden Fall gelinkt, wenn es irgendwann im Zusammenhang mit MULINK gebraucht wird, selbst wenn
- keine Referenz damit erfuellt wird.
-
-
-
-
- 6. Assembler
- ---------
-
- Wer den Assembler benutzen moechte sei auf die entsprechende Texinfo-Datei (Dok.) und auf das
- RISC-OS Referenz-Handbuch verwiesen. Soviel hier: aufgerufen wird er wie
-
- as -o o.sample s.sample
-
- Erzeugt wird eine Objekt-Datei im MUPROS-Format.
- Achtung: Assembler-Befehle werden kleingeschrieben, Registerangaben duerfen auch gross ge-
- schrieben werden.
- ARM/MUPROS-spezifische Pseudo-Befehle:
-
- .objname <name> benennt das gerade Assemblierte Objekt mit <name> (Default: Dateiname)
- .segid <name> die segment ID wird zu <name> (Default: 'code')
- .segattr <'RO'|'RW'> Read-only oder Read-Write Segment (Default: 'RW')
-
- Im Moment unterstuetzt der Assembler keine getrennten Code- und Daten- und Null-initialisierte
- Segmente (.text, .data, .bss), ausser diese werden in getrennten Dateien assembliert.
-
- Ein Beispiel eines Assembler-Quelltextes ist risclib.s.div-fast. Weitere Beispiele lassen sich
- mit GCC -O -S ... erzeugen.
-
- Eine vollstaendige Liste der Assembler-Befehle (Auszug aus dem Quelltext):
-
- /* format of the assembler string :
-
- %<bitfield>r print as an ARM register
- %<bitfield>f print a floating point constant if >7 else an fp register
- %c print condition code (always bits 28-31)
- %P print floating point precision in arithmetic insn
- %Q print floating point precision in ldf/stf insn
- %R print floating point rounding mode
- %<bitnum>'c print specified char iff bit is one
- %<bitnum>-<len>'c print specified char iff bit is one and length of command after c is at least len
- %<bitnum>`c print specified char iff bit is zero
- %<bitnum>?ab print a if bit is one else print b
- %p print 'p' iff bits 12-15 are 15
- %o print operand2 (immediate or register + shift)
- %a print address for ldr/str instruction
- %b print branch destination
- %A print address for ldc/stc/ldf/stf instruction
- %m print register mask for ldm/stm instruction
- %s print bits 0-23 as swi number/name
- %L print ldm type (fd, ea and the like ...)
- %S print stm type
- %r print adr operand
-
- /* ARM instructions */
- "mul%c%20's %16-19r,%0-3r,%8-11r",
- "mla%c%20's %16-19r,%0-3r,%8-11r,%12-15r",
- "and%c%20's %12-15r,%16-19r,%o",
- "eor%c%20's %12-15r,%16-19r,%o",
- "sub%c%20's %12-15r,%16-19r,%o",
- "rsb%c%20's %12-15r,%16-19r,%o",
- "add%c%20's %12-15r,%16-19r,%o",
- "adr%c%20's %12-15r,%r",
- "adc%c%20's %12-15r,%16-19r,%o",
- "sbc%c%20's %12-15r,%16-19r,%o",
- "rsc%c%20's %12-15r,%16-19r,%o",
- "tst%c%p %16-19r,%o",
- "teq%c%p %16-19r,%o",
- "cmp%c%p %16-19r,%o",
- "cmn%c%p %16-19r,%o",
- "orr%c%20's %12-15r,%16-19r,%o",
- "mov%c%20's %12-15r,%o",
- "bic%c%20's %12-15r,%16-19r,%o",
- "mvn%c%20's %12-15r,%o",
- "str%c%22'b %12-15r,%a",
- "ldr%c%22'b %12-15r,%a",
- "stm%c%S %16-19r%21'!,%m",
- "ldm%c%L %16-19r%21'!,%m%22'^",
- "b%24-2'l%c%24'l %b",
- "swi%c %s",
- /* Floating point coprocessor instructions */
- "adf%c%P%R %12-14f,%16-18f,%0-3f",
- "muf%c%P%R %12-14f,%16-18f,%0-3f",
- "suf%c%P%R %12-14f,%16-18f,%0-3f",
- "rsf%c%P%R %12-14f,%16-18f,%0-3f",
- "dvf%c%P%R %12-14f,%16-18f,%0-3f",
- "rdf%c%P%R %12-14f,%16-18f,%0-3f",
- "pow%c%P%R %12-14f,%16-18f,%0-3f",
- "rpw%c%P%R %12-14f,%16-18f,%0-3f",
- "rmf%c%P%R %12-14f,%16-18f,%0-3f",
- "fml%c%P%R %12-14f,%16-18f,%0-3f",
- "fdv%c%P%R %12-14f,%16-18f,%0-3f",
- "frd%c%P%R %12-14f,%16-18f,%0-3f",
- "pol%c%P%R %12-14f,%16-18f,%0-3f",
- "mvf%c%P%R %12-14f,%0-3f",
- "mnf%c%P%R %12-14f,%0-3f",
- "abs%c%P%R %12-14f,%0-3f",
- "rnd%c%P%R %12-14f,%0-3f",
- "sqt%c%P%R %12-14f,%0-3f",
- "log%c%P%R %12-14f,%0-3f",
- "lgn%c%P%R %12-14f,%0-3f",
- "exp%c%P%R %12-14f,%0-3f",
- "sin%c%P%R %12-14f,%0-3f",
- "cos%c%P%R %12-14f,%0-3f",
- "tan%c%P%R %12-14f,%0-3f",
- "asn%c%P%R %12-14f,%0-3f",
- "acs%c%P%R %12-14f,%0-3f",
- "atn%c%P%R %12-14f,%0-3f",
- "flt%c%P%R %16-18f,%12-15r",
- "fix%c%P%R %12-15r,%0-2f",
- "wfs%c %12-15r",
- "rfs%c %12-15r",
- "wfc%c %12-15r",
- "rfc%c %12-15r",
- "cmf%c %16-18f,%0-3f",
- "cnf%c %16-18f,%0-3f",
- "cmfe%c %16-18f,%0-3f",
- "cnfe%c %16-18f,%0-3f",
- "stf%c%Q %12-14f,%A",
- "ldf%c%Q %12-14f,%A",
-
-
-
-
- 6. Stubs / RISC_OSlib
- ------------------
-
- Mit dem GNU C/C++ Compiler sollten Sie auch die konvertierten Versionen von Stubs und RISC_OSlib
- erhalten haben (stubsmu und oslib_mu im Verzeichnis risclib). Sollte dies nicht der Fall sein,
- so koennen Sie diese mit der Obey-Datei risclib.makelibs erzeugen.
-
- Noch einmal: Stubs immer vor RISC_OSlib linken.
-
-
-
-
- 7. Eigene Bibliotheken
- -------------------
-
- Eigene Bibliotheken werden wie folgt erstellt:
-
- 1. Einzelne Module compilieren
- 2. Objekte zu einer Datei zusammensetzen (z.B. mit fappend)
-
- Uebrigens bedeutet
-
- mulink .... o.sample1 o.sample2
-
- genau dasselbe wie
-
- fappend o.sample1 o.sample2
- mulink .... o.sample1
-
- Es darf deshalb jede Art von MUPROS-Objekt-Dateien einfach zusammengefuegt werden: 'Bundling'
- a la MUPROS.
-
- !AUFRUF!: Wer irgend eine geniale Funktions- oder Klassen-Sammlung geschrieben hat, soll sie
- -------- doch bitte den anderen RISC-OS-Benuetzern zur Verfuegung stellen. Am besten an
- untenstehende Adresse schicken. Ich werde versuchen, alles ankommende aufeinander abzustimmen
- und weiterzuverteilen. Ich hoffe, es kommt was (von mir sicher frueher oder spaeter, ich habe
- aber leider noch andere Projekte).
-
-
-
-
- 8. Objective C
- -----------
-
- Die aktuelle RISC-OS-Version von GNU C/C++ unterstuetzt Objective C nicht. Wer einen ent-
- sprechenden Bedarf hat, soll sich doch bitte bei untenstehender Adresse melden.
-
-
-
-
- 9. "Support"
- ---------
-
- In vielen Mailboxen finden Sie Konferenzen zum Thema GNU C/C++. Wer Zugang zum Internet bzw.
- zu den UUCP-News hat, kann sich an die Newsgroups gnu.g++... wenden. Ausserdem stehe ich -
- besonders fuer RISC-OS-spezifische Probleme - zur Verfuegung:
-
- Thomas Aeby
- Graeffet 406
- 1735 Giffers
- Schweiz
- Tel. 037 38 16 00
- EMail aeby@uropax.contrib.de
-
-
-
-
- 10. Quelltexte
- ----------
-
- Alle Quelltexte zum Compiler und zum Assembler sind bei obenstehender Adresse erhaeltlich.
-
-
-
-
- 11. Fliesskomma-Arithmetik
- ----------------------
-
- Fliesskomma-Arithmetik steht nun trotz gegenteiliger Ankuendigung doch schon zur Verfuegung.
- Aber: Keine Funktionsgarantie - kaum getestet.
-
-
-
-
- 12. Speicherbedarf
- --------------
-
- Um C++-Programme compilieren zu koennen sind ueber 2MByte freier Speicher noetig. Standard C
- kommt mit weniger aus, braucht aber immer noch so ca. 1.2-2MByte. Fehlermeldungen wie 'virtual
- Memory exhausted' zeigen Speichermangel an.
-
-
-
-
-
- 13. Debugger
- --------
-
- Sorry, wird nicht unterstuetzt. Auf Assembler-Level ist natuerlich sowohl der !DDT als auch
- Debug einsetzbar, Source-Level-Debugging is' aber nicht.